# Лекция: Наследование в Java

Наследование - это один из основных принципов объектно-ориентированного программирования. Он позволяет создавать новый класс на основе существующего класса.

## Ключевое слово extends

Наследование в Java реализуется с помощью ключевого слова `extends`.

```java
class SubClass extends SuperClass {
    // код класса
}
```

## Метод super

Метод `super` используется для вызова конструктора или методов суперкласса.

```java
super(); // вызов конструктора суперкласса
super.myMethod(); // вызов метода суперкласса
```

## Переопределение методов

Переопределение методов - это возможность подкласса предоставить свою собственную реализацию метода, уже существующего в его суперклассе.

```java
@Override
void myMethod() {
    // новая реализация метода
}
```

---

# Практические задания

1. **Создайте класс `Animal` с методом `eat`, и класс `Dog`, который наследуется от `Animal`. Создайте объект `Dog` и вызовите его метод `eat`.** (Сложность: 1/5)
```java
class Animal {
    void eat() {
        System.out.println("Eating...");
    }
}

class Dog extends Animal {
}

Dog myDog = new Dog();
myDog.eat();
```

2. **Создайте класс `Vehicle` с методом `drive`, и класс `Car`, который наследуется от `Vehicle` и переопределяет метод `drive`. Создайте объект `Car` и вызовите его метод `drive`.** (Сложность: 2/5)
```java
class Vehicle {
    void drive() {
        System.out.println("Driving...");
    }
}

class Car extends Vehicle {
    @Override
    void drive() {
        System.out.println("Driving a car...");
    }
}

Car myCar = new Car();
myCar.drive();
```

3. **Создайте класс `Shape` с методом `getArea`, класс `Rectangle`, который наследуется от `Shape` и переопределяет метод `getArea`, и класс `Circle`, который также наследуется от `Shape` и переопределяет метод `getArea`. Создайте объекты `Rectangle` и `Circle` и вызовите их методы `getArea`.** (Сложность: 3/5)
```java
class Shape {
    double getArea() {
        return 0.0;
    }
}

class Rectangle extends Shape {
    double width;
    double height;

    @Override
    double getArea() {
        return width * height;
    }
}

class Circle extends Shape {
    double radius;

    @Override
    double getArea() {
        return Math.PI * radius * radius;
    }
}

Rectangle myRectangle = new Rectangle();
myRectangle.width = 10.0;
myRectangle.height = 20.0;
System.out.println(myRectangle.getArea());

Circle myCircle = new Circle();
myCircle.radius = 5.0;
System.out.println(myCircle.getArea());
```

4. **Создайте класс `Person` с полем `name` и методом `sayHello`, класс `Student`, который наследуется от `Person`, добавляет поле `grade` и переопределяет метод `sayHello`, и класс `Teacher`, который также наследуется от `Person`, добавляет поле `subject` и переопределяет метод `sayHello`. Создайте объекты `Student` и `Teacher` и вызовите их методы `sayHello`.** (Сложность: 4/5)
```java
class Person {
    String name;

    void sayHello() {
        System.out.println("Hello, my name is " + name);
    }
}

class Student extends Person {
    int grade;

    @Override
    void sayHello() {
        System.out.println("Hello, my name is " + name + " and I'm in grade " + grade);
    }
}

class Teacher extends Person {
    String subject;

    @Override
    void sayHello() {
        System.out.println("Hello, my name is " + name + " and I teach " + subject);
    }
}

Student myStudent = new Student();
myStudent.name = "John";
myStudent.grade = 5;
myStudent.sayHello();

Teacher myTeacher = new Teacher();
myTeacher.name = "Jane";
myTeacher.subject = "Math";
myTeacher.sayHello();
```

5. **Создайте класс `Vehicle` с полем `speed` и методами `drive` и `stop`, класс `Car`, который наследуется от `Vehicle`, добавляет поле `brand` и переопределяет метод `drive`, и класс `Bicycle`, который также наследуется от `Vehicle`, добавляет поле `type` и переопределяет метод `drive`. Создайте объекты `Car` и `Bicycle`, вызовите их методы `drive` и `stop`, и выведите их поля `speed`, `brand` и `type`.** (Сложность: 5/5)
```java
class Vehicle {
    int speed;

    void drive() {
        speed = 10;
    }

    void stop() {
        speed = 0;
    }
}

class Car extends Vehicle {
    String brand;

    @Override
    void drive() {
        speed = 60;
    }
}

class Bicycle extends Vehicle {
    String type;

    @Override
    void drive() {
        speed = 15;
    }
}

Car myCar = new Car();
myCar.brand = "Toyota";
myCar.drive();
System.out.println(myCar.speed);
myCar.stop();
System.out.println(myCar.speed);

Bicycle myBicycle = new Bicycle();
myBicycle.type = "Mountain";
myBicycle.drive();
System.out.println(myBicycle.speed);
myBicycle.stop();
System.out.println(myBicycle.speed);
```